﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using XRM.Security.DataAccess.Enums;
using XRM.Security.DataAccess.Helpers;
using XRM.Security.DataAccess.Interfaces;
using db = XRM.Security.DataAccess.Models;

namespace XRM.Security.WebUI.Models.SystemUser
{
    public class UserRole
    {
        public string RoleName { get; set; }
        public string Description { get; set; }
    }

    public class SystemUserModel : BaseViewModel, IValidatableObject
    {
        public SystemUserModel()
        {
            GetAllRoles();
            Roles = new List<UserRole>();
        }

        public SystemUserModel(db.SystemUser dbEntity)
        {
            GetAllRoles();
            if (dbEntity != null)
            {
                Id = dbEntity.Id;
                Login = dbEntity.Login;
                FirstName = dbEntity.FirstName;
                LastName = dbEntity.LastName;
                MotherName = dbEntity.MotherName;
                FullName = dbEntity.FullName();
                Post = dbEntity.Post;
                Roles = dbEntity.RoleMembers.Select( s => s.Role )
                    .Select( s => new UserRole { RoleName = s.Name, Description = s.Description } ).ToList();
            }
        }

        private void GetAllRoles()
        {
            AllRoles = Enum.GetValues( typeof( UserRoles ) ).Cast<UserRoles>()
                .Select( s => new UserRole {RoleName = s.ToString(), Description = s.Description()})
                .ToList();
        }

        public void RolesFromString(string data)
        {
            if (string.IsNullOrEmpty(data))
                return;

            string[] arr = data.Split(',');
            foreach (string item in arr)
                Roles.Add(new UserRole { RoleName = item, Description = ((UserRoles)Enum.Parse(typeof(UserRoles), item)).Description() });
        }

        [Display(Name = "Пользователь домена")]
        [Required(ErrorMessage = "Поле 'Пользователь домена' обязательное")]
        [MaxLength(50, ErrorMessage = "Максимальная длина поля 'Пользователь домена' 50 символов")]
        public string Login { get; set; }

        [Display(Name = "Имя")]
        [Required(ErrorMessage = "Поле 'Имя' обязательное")]
        [MaxLength(50, ErrorMessage = "Максимальная длина поля 'Имя' 50 символов")]
        public string FirstName { get; set; }

        [Display(Name = "Фамилия")]
        [Required(ErrorMessage = "Поле 'Фамилия' обязательное")]
        [MaxLength(50, ErrorMessage = "Максимальная длина поля 'Фамилия' 50 символов")]
        public string LastName { get; set; }

        [Display(Name = "Отчество")]
        [MaxLength(50, ErrorMessage = "Максимальная длина поля 'Отчество' 50 символов")]
        public string MotherName { get; set; }

        [Display(Name = "Должность")]
        [Required(ErrorMessage = "Поле 'Должность' обязательное")]
        [MaxLength(500, ErrorMessage = "Максимальная длина поля 'Должность' 500 символов")]
        public string Post { get; set; }

        public string FullName
        {
            get; private set;
        }

        public string RolesColumnData
        {
            get
            {
                if (Roles != null && Roles.Any())
                    return Roles.Select(i => i.Description).ToList().Aggregate((current, next) => current + "<br/>" + next);
                else
                    return "";
            }
        }

        [Display( Name = "Роли" )]
        public List<UserRole> Roles { get; set; }
        public List<UserRole> AllRoles { get; set; }
        
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }
}